﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "IGraphicsNode.h"
#include "AnchorAlignmentType.h"
#include "TextPrimitiveType.h"
#include "GTextStatus.h"
#include "GcmpApiDeclaration.h"
#include "VertexStreamPrimitiveType.h"

namespace gcmp
{
    /// \brief 文字图形节点
    class GCMP_GRAPHICS_NODE_INTERFACE_EXPORT IGraphicsText : public IGraphicsNode
    {
        DEFINE_CAST_DERIVED(IGraphicsText, IGraphicsNode)

    public:
        /// \brief 析构器
        virtual ~IGraphicsText();


        /// \brief 设置文字的插入位置
        /// \param pos 文字的插入世界坐标位置。
        /// 如果文字是IGraphicsZoomFree的子节点，则 pos.x 和 pos.y 分别是相对于 IGraphicsZoomFree::Coordinate3d::Origin() 的局部偏移，单位是像素
        /// \return true-设置成功；false-设置失败    
        virtual bool SetPosition(const Vector3d& pos) = 0;

        /// \brief 获取文字对象的插入位置
        /// \return 文字对象插入位置的世界坐标。
        /// 如果文字是IGraphicsZoomFree的子节点，则 pos.x 和 pos.y 分别是相对于 IGraphicsZoomFree::Coordinate3d::Origin() 的局部偏移，单位是像素
       virtual Vector3d GetPosition()const = 0;

        /// \brief 获取文字对象的流向
        /// \return 文字对象的流向
        virtual Vector3d GetDirection() const = 0;

        /// \brief 获取文字对象的法线方向
        /// \return 文字对象的法线方向
        virtual Vector3d GetNormal()const = 0;

        /// \brief 设置设置文字显示类型，只对TrueType类型字体有效，必需在TessellateText之前调用
        /// \param textPrimitiveType 字体显示类型TextPrimitiveType::Triangle：三角形；TextPrimitiveType::Line：线框
        /// \return true-设置成功；false-设置失败
        virtual bool SetTextPrimitiveType(TextPrimitiveType textPrimitiveType) = 0;

        /// \brief 设置锚点相对于文本包围盒的位置
        /// \param alignment 锚点相对于文本包围盒的位置，参见：AnchorAlignmentType
        /// \return 无
        /// \see AnchorAlignmentType
       virtual bool SetAnchorAlignment(AnchorAlignmentType alignment) = 0;

       /// \brief 设置文字的内容
       /// \param pUnicodeString 内容的宽字符数组，必须是unicode编码格式
       /// \return 无        
       virtual bool  SetContent(const std::wstring& pUnicodeString) = 0;

       /// \brief 获取文字对象的内容文本
       /// \return 文字对象的内容文本
       virtual std::wstring GetContent()const = 0;

    public:
        /// \brief 设置文字文字的流向
        /// \param dir 文字文字的流向
        /// \return 无    
        virtual void SetDirection(const Vector3d& dir) = 0;

        /// \brief 设置文字的法线方向
        /// \param normal 文字的法线方向
        /// \return 无    
        virtual void SetNormal(const Vector3d& normal) = 0;

        /// \brief 设置文字对象字符大小
        /// \param charSize 文字对象字符大小
        /// \return 无    
        virtual void  SetCharSize(float charSize) = 0;

        /// \brief 获取文字对象字符大小
        /// \return 文字对象字符大小
        virtual float GetCharSize() const = 0;

        /// \brief 获取字符的宽度因子
        /// \return 字符的宽度因子
        virtual float GetWidthFactor() const = 0;

        /// \brief 设置字符的宽度因子
        /// \param widthFactor 字符的宽度因子
        /// \return 无    
        virtual void SetWidthFactor(float widthFactor) = 0;

         /// \brief 获取文字显示类型，只对TrueType类型字体有效
         /// \return 字体显示类型TextPrimitiveType::Triangle：三角形；TextPrimitiveType::Line：线框
        virtual TextPrimitiveType GetTextPrimitiveType() const = 0;

        /// \brief 获取锚点相对于文本包围盒的位置
        /// \return 锚点相对于文本包围盒的位置，参见：AnchorAlignmentType
        /// \see AnchorAlignmentType
        virtual AnchorAlignmentType GetAnchorAlignment() const = 0;

        /// \brief 获取文字在二维平面的包围盒
        ///
        /// 包围盒可能为空，外部使用时一定要进行处理，否则会造成崩溃(必须在GenerateGeometries之后才能有效)
        /// \return 文字二维包围盒
        virtual Box3d BoundingBox3d() const = 0;

        /// \brief 获取调试信息
        /// \return 调试信息
        virtual std::wstring GetStringForDebug() const = 0;

        /// \brief 获取文字字体路径
        /// \return 文字字体路径
        virtual const std::wstring& GetFontFilePath() const = 0;

        /// \brief 获取文字最大宽度
        /// \return 文字最大宽度
        virtual double GetMaxWidth() const = 0;

        /// \brief 获取文字是否使用投影线颜色，默认使用面颜色
        /// \return true-是；false-否
        virtual bool IsUseProjectionLineColor() const = 0;

        /// \brief 设置文字是否使用投影线颜色
        /// \param useProjectionLineColor 该文字是否使用投影线颜色：true-是；false-否
        /// \return 无
        virtual void SetUseProjectionLineColor(bool useProjectionLineColor) = 0;

        /// \brief 文字是否沿X轴（局部坐标系下）镜像
        ///
        /// （兼容Teigha）局部坐标系下的X轴指的是与文字流向垂直的方向
        /// \return 文字是否沿X轴（局部坐标系下）镜像
        virtual bool IsMirroredInX() const = 0;

        /// \brief 设置文字是否沿X轴（局部坐标系下）镜像
        ///
        /// （兼容Teigha）局部坐标系下的X轴指的是与文字流向垂直的方向
        /// \param isMirroredInX 是否镜像
        /// \return 设置成功返回ture,否则返回false
        virtual bool SetIsMirroredInX(bool isMirroredInX) = 0;

        /// \brief 文字是否沿Y轴镜像（局部坐标系下）镜像
        ///
        /// （兼容Teigha）局部坐标系下的Y轴指的是文字流向的方向
        /// \return 文字是否沿Y轴镜像（局部坐标系下）镜像
        virtual bool IsMirroredInY() const = 0;

        /// \brief 设置文字是否沿Y轴（局部坐标系下）镜像
        ///
        /// （兼容Teigha）局部坐标系下的Y轴指的是文字流向的方向
        /// \param isMirroredInY 是否镜像
        /// \return 设置成功返回ture,否则返回false
        virtual bool SetIsMirroredInY(bool isMirroredInY) = 0;


    public:
        /// \brief 创建默认的文字图形节点
        /// \return 文字图形节点
        static OwnerPtr<IGraphicsText> Create();

        /// \brief 创建文字图形节点
        /// \param fontfullpath 文字字体类型文件所在的完整路径
        /// \param position 文字插入位置
        /// \param direction 文字流向
        /// \param normal 文字法线方向
        /// \param charSize 文字字符大小
        /// \param content 文字内容
        /// \param alignment 文字锚点相对于文本包围盒的位置
        /// \param widthFactor 文字字符的宽度因子
        /// \return 文字图形节点
        static OwnerPtr<IGraphicsText> Create(const std::wstring & fontfullpath,
            const Vector3d& position,
            const Vector3d& direction,
            const Vector3d& normal,
            const float charSize,
            const std::wstring & content,
            AnchorAlignmentType alignment = AnchorAlignmentType::BottomCenter,
            const float widthFactor = 1.0f);

    public:
        /// \brief 将文字文字离散化为显示顶点数据，顶点可能代表三角片或者线体
        /// \param vec3List 返回离散的三角形顶点集合
        /// \param inList 返回离散的三角形顶点索引集合
        /// \param prmtvtype 返回离散的原语类型
        /// \return 错误码，参见：GTextStatus
        /// \see GTextStatus
        GCMP_DEPRECATED_API(2021 / 10 / 01) virtual GTextStatus TessellateText(std::vector<Vector3d>& vec3List, std::vector<unsigned int> &inList, VertexStreamPrimitiveType& prmtvtype) const = 0;

    };
}
